#ifndef MANAGESTU_H
#define MANAGESTU_H

#include <memory>
#include <mutex>
#include <vector>
#include <shared_mutex>
#include <unordered_set>
#include "entity/Student.h"

/*************************************************
  * 描述：学生信息操作管理工具类，提供增删改查功能
  * File：ManageStu.h
  * Author：name@mozihealthcare.cn
  * Date：2025-07-18
  * Update：
  * ************************************************/
namespace gao {
  class ManageStu {
  private:
    //学生指针数组
    vector<unique_ptr<Student>> m_arr;
    //单例对象
    static ManageStu* m_instance;
    //静态互斥锁，保证获取的是单例对象
    static mutex m_mtx;
    //读写锁
    static shared_mutex m_rwMutex;
    // 私有构造函数，禁止外部实例化
    ManageStu()=default;
    //学生id集合
    unordered_set<int> m_set;
  protected:
    // 根据id查找学生信息
    vector<unique_ptr<Student>>::const_iterator findStudent(int id) const;

  public:
    // 获取单例对象
    static ManageStu* getInstance();
    // 添加学生信息
    void addStudent();
    // 删除学生信息
    void delStudent(int id);
    // 更新学生信息
    void updateStudent(int id);

    // 查询学生信息
    void queryStudent();
    // 打印所有学生信息
    void print() ;
    // 展示菜单
    void menu();
    // 输入检验函数
    template<typename T>
    void checkInput(T& input) const;

    // get获取数组
    const vector<unique_ptr<Student>>& getArr() const { return m_arr; }

    //id集合
    const unordered_set<int>& getIdSet() const { return m_set; }

    // 删除单例对象
    static void delInstance();

    void notifyStus() ;

    //清空学生信息
    void clear(bool isConfirm=true);

    //判断是否存在
    bool isExist(int key) const;

    //保存学生信息到文件
    void saveAllStus();

    //从文件中加载学生信息
    void loadAllStus();

    //打印菜单
    void printMenu() const;

    ~ManageStu();
  };
}


#endif //MANAGESTU_H
